﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BE.SearchCriteria;
using BE;
using BLL;
using VentaPorCatalogos.Models;
using BLL.Exceptions;

namespace VentaPorCatalogos.Pages
{
    public partial class CampañasArticulos : VentaPorCatalogos.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                btnAgregarArticulos.Enabled = false;
                btnQuitarArticulos.Enabled = false;
                btnImportar.Enabled = false;
                Session["Model"] = null;
                gdvArticulos.DataSource = new List<ArticulosCampañaBE>();
                gdvArticulos.DataBind();
            }
        }

        protected void btnSelCampaña_Click(object sender, ImageClickEventArgs e)
        {
            int wCount = 0;

            if (txtCampaña.Text.Trim().Length > 0)
            {
                CampañaSC wFiltroSC = new CampañaSC();
                wFiltroSC.Descripcion = txtCampaña.Text;
                List<CampañaBE> wListResultado = CampañaBLL.SeleccionarPorParametros(wFiltroSC, 0, null, ref wCount);
                if (wListResultado != null && wListResultado.Count > 0)
                {
                    if (wListResultado.Count == 1)
                    {
                        hidIdCampaña.Value = wListResultado[0].IdCampaña.ToString();
                        txtCampaña.Text = wListResultado[0].Descripcion;
                        MostrarArticulos();
                    }
                    else
                        EjecutarScript(string.Format("SeleccionarCampaña(\"{0}\");", txtCampaña.Text));
                }
                else
                {
                    txtCampaña.Text = string.Empty;
                    EjecutarScript("alert(\"Sin resultados para el filtro especificado.\");");
                }
            }
            else
            {
                EjecutarScript(string.Format("SeleccionarCampaña(\"{0}\");", txtCampaña.Text));
            }


        }

        protected string GetButtonPostBack()
        {
            return Page.ClientScript.GetPostBackEventReference(btnMostrarArticulos, string.Empty);
        }

        private void MostrarArticulos()
        {
            List<ArticulosCampañaBE> oArticulosCampañaBEList = new List<ArticulosCampañaBE>();
            int wIdCampaña = 0;

            if (int.TryParse(hidIdCampaña.Value, out wIdCampaña))
            {
                ArticulosCampañaSC oArticulosCampañaSC = new ArticulosCampañaSC();
                oArticulosCampañaSC.IdCampaña = wIdCampaña;
                oArticulosCampañaBEList = ArticulosCampañasBLL.SeleccionarPorCampaña(oArticulosCampañaSC);
            
                ArticulosCampañaModel oArticulosCampañaModel = new ArticulosCampañaModel();
                oArticulosCampañaModel.IdCampaña = wIdCampaña;
                oArticulosCampañaModel.listArticulosCampaña = oArticulosCampañaBEList;
                SetModel<ArticulosCampañaModel>(oArticulosCampañaModel);

                if (oArticulosCampañaModel.listArticulosCampaña.Count == 0)
                {
                    MostrarMensaje("No se han definido artículos para la campaña.");
                }
                gdvArticulos.PageIndex = 0;
                CargarGrilla();

                btnAgregarArticulos.Enabled = true;
                btnQuitarArticulos.Enabled = true;
                btnImportar.Enabled = true;
            }
        }

        private void CargarGrilla()
        {
            ArticulosCampañaModel oArticulosCampañaModel = GetModel<ArticulosCampañaModel>();
            gdvArticulos.DataSource = oArticulosCampañaModel.listArticulosCampaña;
            gdvArticulos.DataBind();

        }

        protected void gdvArticulos_RowEditing(object sender, GridViewEditEventArgs e)
        {
            gdvArticulos.EditIndex = e.NewEditIndex;
            CargarGrilla();

            //EjecutarScript("ConfigurarDatePickers();");
        }

        protected void gdvArticulos_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            string wCodArticulo = e.Keys[0].ToString();

            ArticulosCampañaModel oArticulosCampañaModel = GetModel<ArticulosCampañaModel>();
            ArticulosCampañaBE oArticulosCampañaBE;

            // Edición de página
            oArticulosCampañaBE = oArticulosCampañaModel.listArticulosCampaña.Find(x => x.IdArticulo.ToString() == wCodArticulo);
            if (oArticulosCampañaBE != null)
            {
                if (e.NewValues["Pagina"]== null)                                
                {
                    e.Cancel = true;
                    MostrarMensaje("Debe ingresar una página.");
                    return;
                }
                string wPagina = e.NewValues["Pagina"].ToString();
                oArticulosCampañaBE.Pagina = wPagina;

                decimal wPrecio;
                if (e.NewValues["Precio"] == null)
                {
                    e.Cancel = true;
                    MostrarMensaje("Debe ingresar un precio.");
                    return;
                }
                if (!decimal.TryParse(e.NewValues["Precio"].ToString(), out wPrecio))                
                {
                    e.Cancel = true;
                    MostrarMensaje("Debe ingresar un importe válido.");
                    return;
                }
                oArticulosCampañaBE.Precio = wPrecio;
            }
            oArticulosCampañaModel.AccionesList.EditarElemento(oArticulosCampañaBE.Articulo.IdArticulo);

            gdvArticulos.EditIndex = -1;
            CargarGrilla();
        }

        protected void gdvArticulos_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            gdvArticulos.EditIndex = -1;
            CargarGrilla();
        }

        protected void gdvArticulos_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            string wCodArticulo = e.Keys[0].ToString();

            ArticulosCampañaModel oArticulosCampañaModel = GetModel<ArticulosCampañaModel>();
            ArticulosCampañaBE oArticulosCampañaBE;
            oArticulosCampañaBE = oArticulosCampañaModel.listArticulosCampaña.Find(x => x.IdArticulo.ToString() == wCodArticulo);
            if (oArticulosCampañaBE != null)
            {
                oArticulosCampañaModel.listArticulosCampaña.Remove(oArticulosCampañaBE);
            }
            oArticulosCampañaModel.AccionesList.QuitarElemento(oArticulosCampañaBE.Articulo.IdArticulo);
            SetModel<ArticulosCampañaModel>(oArticulosCampañaModel);

            CargarGrilla();
        }

        protected void btnMostrarArticulos_Click(object sender, EventArgs e)
        {
            MostrarArticulos();
        }

        protected void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                ArticulosCampañaModel oModel = GetModel<ArticulosCampañaModel>();

                if (oModel != null)
                {
                    ArticulosCampañasBLL.Guardar(oModel.IdCampaña, oModel.listArticulosCampaña, oModel.AccionesList);
                    oModel.AccionesList.InicializarAcciones();

                    MostrarMensaje("Catálogo registrado correctamente");
                }
                
            }
            catch (BLLException bllEx)
            {
                MostrarMensaje(bllEx.Message);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void gdvArticulos_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gdvArticulos.PageIndex = e.NewPageIndex;
            CargarGrilla();
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            ArticulosCampañaModel oArticulosCampañaModel = new ArticulosCampañaModel();
            SetModel<ArticulosCampañaModel>(oArticulosCampañaModel);
            BlanquearControles(divFiltros.Controls);
            CargarGrilla();

        }

        protected void btnImportar_Click(object sender, EventArgs e)
        {
            int wIdCampaña = 0;
            if (!int.TryParse(hidIdCampaña.Value, out wIdCampaña))
                return;

            ArticulosCampañasBLL.ImportarArticulos(wIdCampaña);

            MostrarArticulos();

            MostrarMensaje("Artículos importados correctamente");
        }

        protected void gdvArticulos_RowCreated(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if (e.Row.DataItem != null)
                {
                    BulletedList blPresentaciones = (BulletedList)e.Row.FindControl("blPresentaciones");
                    blPresentaciones.DataSource = (e.Row.DataItem as ArticulosCampañaBE).Articulo.Presentaciones;
                }
            }       
        }

        protected void btnAgregarArticulos_Click(object sender, EventArgs e)
        {
            ArticulosCampañaModel oArticulosCampañaModel = GetModel<ArticulosCampañaModel>();

            if (oArticulosCampañaModel == null)
            {
                MostrarMensaje("Seleccione una campaña a la cual agregar artículos");
                return;
            }

            if (oArticulosCampañaModel.ArticulosAgregados != null && oArticulosCampañaModel.ArticulosAgregados.Count > 0)
            {
                foreach (ArticulosCampañaBE elemBE in oArticulosCampañaModel.ArticulosAgregados)
                {
                    ArticulosCampañaBE oExistente = oArticulosCampañaModel.listArticulosCampaña.Find(x => x.Articulo.IdArticulo == elemBE.Articulo.IdArticulo);
                    if (oExistente == null)
                    {
                        oArticulosCampañaModel.listArticulosCampaña.Add(elemBE);
                        oArticulosCampañaModel.AccionesList.AgregarElemento(elemBE.Articulo.IdArticulo);
                    }                    
                }
                CargarGrilla();
            }

        }

        protected void btnQuitarArticulos_Click(object sender, EventArgs e)
        {
            ArticulosCampañaModel oArticulosCampañaModel = GetModel<ArticulosCampañaModel>();
            var drArticulosSeleccionados = (from GridViewRow w in gdvArticulos.Rows
                                            where ((CheckBox)w.Cells[0].FindControl("ckbSeleccion")).Checked
                                            select w);
            if (drArticulosSeleccionados.Count() == 0)
            {
                MostrarMensaje("Debe seleccionar al menos un artículo para quitar.");
                return;
            }

            foreach (GridViewRow oRow in drArticulosSeleccionados)
            {
                int wIdArticulo = int.Parse(gdvArticulos.DataKeys[oRow.RowIndex].Value.ToString());

                ArticulosCampañaBE oArticuloCampañaBE = oArticulosCampañaModel.listArticulosCampaña.Find(x => x.IdArticulo == wIdArticulo);
                if (oArticuloCampañaBE != null)
                {
                    oArticulosCampañaModel.listArticulosCampaña.Remove(oArticuloCampañaBE);
                    oArticulosCampañaModel.AccionesList.QuitarElemento(oArticuloCampañaBE.Articulo.IdArticulo);
                }
            }
            SetModel<ArticulosCampañaModel>(oArticulosCampañaModel);
            CargarGrilla();
        }


    }
}